package CDMA;

use strict;
use warnings;

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#			korelacja
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

sub _corel(\@\@) {
	my ($a, $b) = @_;
	my $c = 0;
	for my $i ( 0 .. $#$a ) {
		#print "$a->[$i] $b->[$i] \n"; 
		$c += $a->[$i] * $b->[$i];
	}
	return $c;
}

# korelacja dwoch ciagow: corel(ciag1, ciag2)
sub corel(\@\@) {
	my ($a, $b) = @_;
	return _corel(@$a, @$b);
}

# korelacja skrosna: cross_corel(przesuniecie, ciag)
sub cross_corel($\@) {
	my ($offset, $a) = @_;
	my @b = @$a;
	unshift @b, pop @b for ( 1 .. $offset );
	return _corel(@$a, @b);
}

# autokorelacja: auto_corel(ciag)
sub auto_corel(\@) {
	my $a = shift;
	return _corel(@$a, @$a);
}

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#		rozpraszanie i skramblowanie
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# rozprasza mnozy kazdy element pierwszej tablicy przez wszytkie 
# elementy drugiej tablicy
sub spread(\@\@) {
	my ($a, $b) = @_;
	my $c = [];
	for my $ela (@$a) {
		for my $elb (@$b) { push @$c, $ela * $elb; }
	}
	return $c;
}

# skrambluje; mnozy wszystkie elementy tablicy pierwszej przez
# wszystkie elementy tablicy drugiej; jesli druga sie skonczy
# to bierze jej elementy od poczatku
sub scramble(\@\@) {
	my ($a, $b) = @_;
	my $c = [];
	my $mod = $#$b + 1;
	for ( 0 .. $#$a ) { 
		$c->[$_] = @$a[$_] * @$b[$_ % $mod]; 
	} 
	return $c;
}

sub despread(\@\@) {
	my ($a, $b) = @_;
	my $c = [];
	my $mod = $#$b + 1;
	my $i = -1;
	for ( 0 .. $#$a ) { 	
		if ( $_ % ( $#$b + 1 ) == 0) {
			++$i;
			$c->[$i] = 0;
		}
		$c->[$i] += $a->[$_] * $b->[$_ % $mod];
	}
	return $c;
}

1;
